package cn.yunsenlin.formula.cloud.interfaces;

import cn.yunsenlin.formula.cloud.mysql.bean.generator.TbGroup;

import java.util.List;

/**
 * 计算组服务
 */
public interface GroupService {
    /**
     * 添加计算组
     *
     * @param tbGroup 计算组
     * @param userId  用户ID
     * @return 添加后的计算组
     */
    TbGroup addGroup(TbGroup tbGroup, int userId);

    /**
     * 移除计算组
     *
     * @param id 计算组ID
     */
    void removeGroup(int id);

    /**
     * 更新计算组
     *
     * @param tbGroup 计算组信息
     */
    void updateGroup(TbGroup tbGroup);

    /**
     * 更新计算组时，对新parentId的检查
     *
     * @param tbGroup 计算组信息
     * @return 新parentId是否合法
     */
    boolean updateGroupParentIdCheck(TbGroup tbGroup);

    /**
     * 检查计算组的名称是否重复
     *
     * @param name     计算组名称
     * @param parentId 计算组parentId
     * @return 是否重复
     */
    boolean checkNameIsRepeat(String name, int parentId);

    /**
     * 查询子计算组列表
     *
     * @param id 计算组ID
     * @return 子计算组列表
     */
    List<TbGroup> selectSonGroup(int id);

    /**
     * 检测两个计算组是否是后代关系
     *
     * @param ancestor 祖先ID
     * @param son      后代ID
     * @return 是否是后代关系
     */
    boolean verifyAncestorRelation(int ancestor, int son);

    /**
     * 查询根计算组
     *
     * @param userId 用户ID
     * @return 根计算组
     */
    TbGroup selectRootGroup(Integer userId);

    /**
     * 获取计算组链路 如 根目录/文件夹1/文件夹2
     *
     * @param id 计算组ID
     * @return 计算组链路
     */
    List<TbGroup> getChain(int id);

    /**
     * 查询当前下计算组的计算结果个数
     * @param id 计算组ID
     * @return 计算结果个数
     */
    Integer getAmount(int id);
}
